home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 020 / modula.arc / CHAREDIT.MOD < prev    next >
Encoding:
Text File  |  1986-08-20  |  21.1 KB  |  708 lines

  1.  
  2. MODULE CharEdit;
  3.  
  4. (*
  5.   Edit 16x16 Character sets.
  6.  
  7.          Author: J. Tal
  8.            Date: 04/29/1986
  9.  Implementation: Logitech - IBM/PC
  10.  
  11.           Notes: Modula-2 Version of Charedit.Pas of 7/85 by same author.
  12.  
  13.                  Inspired by INSTEDIT on Atari 400/800's by Sheldon Leemon
  14.                  (approx 1982).
  15.  
  16.                  Instedit was the first character set editor I ever used and
  17.                  most of it's functions are in this program.
  18.  
  19.                  This module will be converted for use onto an ATARI 520ST.
  20. *)
  21.  
  22.  
  23. FROM Environment IMPORT Ptr,GotoXY,Cls;
  24. FROM PcKeys      IMPORT InKey,SpecialKey;
  25. FROM PcScreen    IMPORT ReadScreenChar,WriteScreenChar,DisplayString,
  26.                         Normal,Blink,Reverse;
  27. FROM Functions   IMPORT Power,ToSpaces;
  28. FROM InOut       IMPORT WriteLn,WriteCard,ReadCard,OpenOutput,OpenInput,
  29.                         CloseInput,CloseOutput,Done,Read,WriteString,Write;
  30. FROM Keyboard    IMPORT KeyPressed;
  31.  
  32.  
  33. CONST
  34.   CharOrg = 30;  (* starting x pos on screen FOR character work area *)
  35.   vertOrg = 4;   (* starting y pos *)
  36.   matrixX = 16;
  37.   matrixY = 16;
  38.   bit = 219;
  39.  
  40. TYPE
  41.   mainb = ARRAY[0..127] OF ARRAY[1..matrixY] OF CARDINAL;
  42.   st255 = ARRAY[0..254] OF CHAR;
  43.   st80 = ARRAY[0..80] OF CHAR;
  44.   st25 = ARRAY[0..24] OF CHAR;
  45.  
  46.   CharBits3 = ARRAY[1..matrixX] OF CARDINAL;        (* total row value *)
  47.   CharBits4 = ARRAY[1..matrixY] OF ARRAY[1..matrixX] OF CARDINAL; (* total row/column array *)
  48.  
  49.  
  50. VAR
  51.   bytes,IBMbytes : mainb;                     (* character sets *)
  52.   holdBits : CharBits3;                       (* 16 byte holders *)
  53.   i,j : CARDINAL;
  54.   keymat : ARRAY[1..22] OF st80;
  55.   OpenScreen : ARRAY[1..22] OF st80;          (* title screen *)
  56.   blanks: ARRAY[0..80] OF CHAR;
  57.   IbmMemoryBytes: POINTER TO ARRAY[0..127] OF ARRAY[0..7] OF CHAR;
  58.   Pwr2: ARRAY[0..15] OF CARDINAL;
  59.  
  60.  
  61. PROCEDURE RealPower(x,n : REAL) : REAL;
  62. BEGIN
  63.    IF n=1.0  THEN
  64.      RETURN x
  65.    ELSIF n <= 0.0 THEN
  66.      RETURN 1.0;
  67.    ELSE
  68.      RETURN (x * RealPower(x,n-1.0));
  69.   END;
  70. END RealPower;
  71.  
  72. PROCEDURE pause;
  73. VAR
  74.  ch: CHAR;
  75. BEGIN
  76.   DisplayString(25,1,Blink,' Press Any Key ');
  77.   WHILE NOT KeyPressed() DO
  78.   END;
  79.   Read(ch);
  80.   DisplayString(25,1,Normal,'                ');
  81. END pause;
  82.  
  83.  
  84. PROCEDURE KeyDecode (scanval: CARDINAL; VAR job: INTEGER;
  85.                                          VAR key: CARDINAL);
  86. BEGIN
  87.  job := -1;
  88.  
  89.  IF (scanval >= 59) AND (scanval <= 68) THEN
  90.    job := 1;
  91.  ELSIF (scanval >= 84) AND (scanval <= 93) THEN
  92.    job := 2;
  93.  ELSIF (scanval >= 94) AND (scanval <= 103) THEN
  94.    job := 3;
  95.  ELSIF (scanval >= 104) AND (scanval <= 113) THEN
  96.    job := 4;
  97.  END;
  98.  
  99.  CASE job OF
  100.   -1 : key := 0;
  101.  | 1 : key := scanval - 58;
  102.  | 2 : key := scanval - 83;
  103.  | 3 : key := scanval - 93;
  104.  | 4 : key := scanval - 103;
  105.  END;
  106. END KeyDecode;
  107.  
  108.  
  109. PROCEDURE LoadIBM;  (* load 8x8 matrix from memory & convert to 16x16 *)
  110. VAR
  111.   AsciiChar,EightValue,SixteenValue,i1,i2,EX: CARDINAL;
  112. BEGIN
  113.   FOR AsciiChar := 0 TO 127 DO  (* scan each character *)
  114.     FOR i1 := 1 TO 8 DO        (* scan from top to bottom of character *)
  115.       SixteenValue := 0;
  116.       EightValue := ORD(IbmMemoryBytes^[AsciiChar][i1-1]);
  117.       FOR i2 := 1 TO 8 DO      (* test each bit *)
  118.         EX := Pwr2[8-i2];
  119.         IF BITSET(EightValue) * BITSET(EX) = BITSET(EX) THEN
  120.           INC(SixteenValue,Power(EX,2)*2+Power(EX,2));  (* stretch out horizontally *)
  121.         END;
  122.       END;
  123.       IBMbytes[AsciiChar,i1*2-1] := SixteenValue;  (* originally 8, now 16, so *)
  124.       IBMbytes[AsciiChar,i1*2] := SixteenValue;    (* stretch out vertically *)
  125.     END;
  126.   END;
  127. END LoadIBM;
  128.  
  129.  
  130. PROCEDURE LoadChars;
  131. VAR
  132.   b,c,r,cardin : CARDINAL;
  133. BEGIN
  134.    DisplayString(24,1,Normal,blanks);
  135.    DisplayString(24,1,Normal,'Character set to load ?');
  136.    GotoXY(25,24);
  137.    OpenInput("SET");
  138.    GotoXY(1,1);
  139.    IF Done THEN
  140.      DisplayString(24,1,Normal,blanks);
  141.      DisplayString(24,1,Normal,'Loading Data ...... ');
  142.      FOR r := 0 TO 127 DO
  143.         FOR c := 1 TO matrixY DO
  144.            ReadCard(cardin);
  145.            bytes[r,c] := cardin;
  146.         END;
  147.       END;
  148.       CloseInput;
  149.    ELSE
  150.       DisplayString(24,1,Normal,blanks);
  151.       DisplayString(24,1,Normal,'load aborted              ');
  152.    END;
  153.    DisplayString(24,1,Normal,blanks);
  154. END LoadChars;
  155.  
  156.  
  157. PROCEDURE SaveChars;
  158.  VAR
  159.    b,c,r : CARDINAL;
  160.  BEGIN
  161.   DisplayString(24,1,Normal,'                                         ');
  162.   DisplayString(24,1,Normal,'Character set to save ?');
  163.   GotoXY(26,24);
  164.   OpenOutput("SET");  (* default extension if none given is SET *)
  165.   GotoXY(1,1);
  166.   IF Done THEN
  167.     GotoXY(1,1);
  168.     DisplayString(24,1,Normal,blanks);
  169.     DisplayString(24,1,Normal,'Saving Data ....... ');
  170.     FOR r := 0 TO 127 DO
  171.       FOR c := 1 TO matrixY DO
  172.         WriteCard(bytes[r,c],6);
  173.       END;
  174.       WriteLn;
  175.     END;
  176.     DisplayString(24,1,Normal,blanks);
  177.     CloseOutput;
  178.   ELSE
  179.     DisplayString(23,1,Normal,'save aborted              ');
  180.   END;
  181. END SaveChars;
  182.  
  183.  
  184. PROCEDURE guideline;
  185. BEGIN
  186.   DisplayString(24,18,Reverse,'<   Press Key of character you want to Edit  >');
  187.   DisplayString(25,11,Reverse,'<  use cursor keys to move / ALT-F2 to save / End to quit >');
  188. END guideline;
  189.  
  190.  
  191. PROCEDURE clrbox;
  192. VAR
  193.  i : CARDINAL;
  194.  clear: ARRAY[0..matrixX-1] OF CHAR;
  195. BEGIN
  196.   ToSpaces(clear,matrixX-1);
  197.   FOR i := 1 TO matrixY DO
  198.     DisplayString(i+vertOrg-1,CharOrg,Normal,clear);
  199.   END;
  200. END clrbox;
  201.  
  202.  
  203. PROCEDURE BitsToBytes( bits : CharBits4; VAR ReturnBytes : CharBits3);
  204. VAR
  205.  i1,i2,totbytes : CARDINAL;
  206. BEGIN
  207.  FOR i1 := 1 TO matrixY DO
  208.    totbytes := 0;
  209.    FOR i2 := 1 TO matrixX DO
  210.      IF bits[i1,i2] = 1 THEN
  211.        totbytes := totbytes + Pwr2[matrixX-i2];
  212.      END;
  213.    END;
  214.    ReturnBytes[i1] := totbytes;
  215.  END;
  216. END BitsToBytes;
  217.  
  218.  
  219. PROCEDURE ByteToBits( abyte : CharBits3; VAR ReturnBits : CharBits4);
  220. VAR
  221.  a,b,i : CARDINAL;
  222. BEGIN
  223.   FOR i := 1 TO matrixY DO
  224.     a := abyte[i];
  225.     FOR b := matrixX-1 TO 0 BY -1 DO
  226.       IF a >= Pwr2[b] THEN
  227.         a := a-Pwr2[b];
  228.         ReturnBits[i,matrixX-b] := 1;
  229.       ELSE
  230.         ReturnBits[i,matrixX-b] := 0;
  231.       END;
  232.     END;
  233.   END;
  234.  END ByteToBits;
  235.  
  236.  
  237. PROCEDURE RotateRight ( VAR bits : CharBits3 ; right : CARDINAL);
  238. VAR
  239.  i0,i1: CARDINAL;
  240.  Carry: BOOLEAN;
  241. BEGIN
  242.   FOR i0 := 1 TO right DO
  243.     FOR i1 := 1 TO matrixY DO
  244.       IF (bits[i1] MOD 2) <> 0 THEN
  245.         Carry := TRUE;
  246.         DEC(bits[i1],1);
  247.       ELSE
  248.         Carry := FALSE;
  249.       END;
  250.       bits[i1] := bits[i1] DIV 2;
  251.       IF Carry THEN
  252.         INC(bits[i1],32768);
  253.       END;
  254.     END;
  255.   END;
  256. END RotateRight;
  257.  
  258.  
  259. PROCEDURE RotateLeft ( VAR bits : CharBits3 ; left : CARDINAL);
  260. VAR
  261.  i0,i1: CARDINAL;
  262.  Carry: BOOLEAN;
  263. BEGIN
  264.   FOR i0 := 1 TO left DO
  265.     FOR i1 := 1 TO matrixY DO
  266.       Carry := (bits[i1] MOD 32768) <> bits[i1];
  267.       bits[i1] := bits[i1] MOD 32768;
  268.       bits[i1] := bits[i1] * 2;
  269.       IF Carry THEN
  270.         INC(bits[i1],1);
  271.       END;
  272.     END;
  273.   END;
  274. END RotateLeft;
  275.  
  276.  
  277. PROCEDURE ShiftUp ( VAR sbytes : CharBits3);
  278. VAR
  279.  i,temp: CARDINAL;
  280. BEGIN
  281.   temp := sbytes[1];
  282.   FOR i := 1 TO matrixX -1 DO
  283.     sbytes[i] := sbytes[i + 1];
  284.   END;
  285.   sbytes[matrixX] := temp;
  286. END ShiftUp;
  287.  
  288. PROCEDURE ShiftDown ( VAR sbytes : CharBits3);
  289. VAR
  290.  i,temp : CARDINAL;
  291. BEGIN
  292.   temp := sbytes[matrixX];
  293.   FOR i := matrixX TO 2 BY -1 DO
  294.     sbytes[i] := sbytes[i - 1];
  295.   END;
  296.   sbytes[1] := temp;
  297. END ShiftDown;
  298.  
  299.  
  300. PROCEDURE ReadBits (VAR ProcessBytes : CharBits3);  (* read bits OF CHAR on screen *)
  301. VAR
  302.  a,x,y,totbytes : CARDINAL;
  303. BEGIN
  304.   FOR y := vertOrg TO vertOrg + matrixY-1 DO
  305.     totbytes := 0;
  306.  
  307.     FOR x := CharOrg TO CharOrg + matrixX-1 DO
  308.       a := ORD(ReadScreenChar(y,x));
  309.       IF a = 219 THEN
  310.         totbytes := totbytes + Pwr2[(CharOrg+(matrixX-1)-x)];
  311.       END;
  312.     END;
  313.  
  314.     ProcessBytes[y - (vertOrg-1)] := totbytes;
  315.   END;
  316.  
  317. END ReadBits;
  318.  
  319.  
  320. PROCEDURE WriteBits (ReturnBits : CharBits4);
  321. VAR
  322.  i,b : CARDINAL;
  323.  ch: CHAR;
  324. BEGIN
  325. FOR i := 1 TO matrixY DO
  326.   FOR b := matrixX -1 TO 0 BY -1 DO
  327.     IF ReturnBits[i,matrixX-b] = 1 THEN
  328.       ch := CHR(bit);
  329.     ELSE
  330.       ch := ' ';
  331.     END;
  332.     WriteScreenChar(i+vertOrg-1,CharOrg+(matrixX-1)-b,Normal,ch);
  333.   END;
  334. END;
  335. END WriteBits;
  336.  
  337.  
  338. PROCEDURE WriteBytes (abyte : CharBits3);
  339. VAR
  340.  i,b : CARDINAL;
  341.  ch: CHAR;
  342.  ReturnBits : CharBits4;
  343. BEGIN
  344.   ByteToBits(abyte,ReturnBits);
  345.   FOR i := 1 TO matrixY DO
  346.     FOR b := matrixX-1 TO 0 BY -1 DO
  347.       IF ReturnBits[i,matrixX-b] = 1 THEN
  348.         ch := CHR(bit);
  349.       ELSE
  350.         ch := ' ';
  351.       END;
  352.       WriteScreenChar(i+vertOrg-1,CharOrg+(matrixX-1)-b,Normal,ch);
  353.     END;
  354.   END;
  355. END WriteBytes;
  356.  
  357. PROCEDURE ReplaceChar(Editchar : CARDINAL);  (* replace WITH the way character was at start OF Edit *)
  358. VAR
  359.  a,x,y,totbytes : CARDINAL;
  360.  ProcessBytes : CharBits3;
  361. BEGIN
  362.   ReadBits(ProcessBytes);
  363.   FOR y := 1 TO matrixY DO
  364.     bytes[Editchar][y] := ProcessBytes[y];
  365.   END;
  366. END ReplaceChar;
  367.  
  368.  
  369. PROCEDURE ShowBits;
  370. VAR
  371.  a,x,y,totbytes : CARDINAL;
  372. BEGIN
  373.   FOR y := vertOrg TO (vertOrg + matrixY)-1  DO
  374.     totbytes := 0;
  375.     FOR x := CharOrg TO (CharOrg + matrixX)-1  DO
  376.       a := ORD(ReadScreenChar(y,x));
  377.       IF a = 219 THEN
  378.         totbytes := totbytes + Pwr2[(CharOrg + (matrixX-1) -x)];
  379.       END;
  380.     END;
  381.     GotoXY(CharOrg+matrixX+3,y);
  382.     WriteCard(totbytes,5);
  383.   END;
  384.   GotoXY(1,1);
  385. END ShowBits;
  386.  
  387.  
  388. PROCEDURE ModifyChar(job : CARDINAL);   (* Job 1 = inverse
  389.                                                2 = twist
  390.                                                3 = mirror
  391.                                                4 = rotate right
  392.                                                5 = rotate left
  393.                                          *)
  394. VAR
  395.  i,i1,i2,i3 : CARDINAL;
  396.  ProcessBytes,ReturnBytes,tempBits : CharBits3;
  397.  ReturnBits,NewBits : CharBits4;
  398. BEGIN
  399.   CASE job OF
  400.     1 :  ReadBits(ProcessBytes);
  401.          FOR i := 1 TO matrixX DO
  402.             ProcessBytes[i] := TRUNC( (RealPower(2.0,FLOAT(matrixX)) -1.0) - FLOAT(ProcessBytes[i]));
  403.          END;
  404.          WriteBytes(ProcessBytes);
  405.  
  406.   | 2 :  ReadBits(ProcessBytes);
  407.          ByteToBits(ProcessBytes,ReturnBits);
  408.          FOR i1 := 1 TO matrixY DO
  409.             FOR i2 := 1 TO matrixX DO
  410.               NewBits[i1,i2] := ReturnBits[(matrixX+1)-i2,i1];
  411.             END;
  412.          END;
  413.          WriteBits(NewBits);
  414.   | 3 :
  415.  
  416.   | 4 :  ReadBits(ProcessBytes);
  417.          RotateRight(ProcessBytes,1);
  418.          WriteBytes(ProcessBytes);
  419.  
  420.   | 5 :  ReadBits(ProcessBytes);
  421.          RotateLeft(ProcessBytes,1);
  422.          WriteBytes(ProcessBytes);
  423.  
  424.   | 6 :
  425.  
  426.   | 7 :  ReadBits(ProcessBytes);
  427.          ShiftUp(ProcessBytes);
  428.          WriteBytes(ProcessBytes);
  429.  
  430.   | 8 :  ReadBits(ProcessBytes);
  431.          ShiftDown(ProcessBytes);
  432.          WriteBytes(ProcessBytes);
  433.  
  434.    ELSE
  435.    END;  (* CASE *)
  436.    ShowBits;
  437. END ModifyChar;
  438.  
  439.  
  440. PROCEDURE CopyChar;
  441. VAR
  442.  i,Editchar : CARDINAL;
  443.  command : ARRAY [0..1] OF CHAR;
  444.  sendBytes : CharBits3;
  445. BEGIN
  446.   DisplayString(22,31,Normal,'Copy which CHAR ?');
  447.   WHILE NOT InKey(command) DO
  448.   END;
  449.   Editchar := ORD(command[0]);
  450.   DisplayString(22,31,Normal,'                  ');
  451.   FOR i := 1 TO matrixY DO
  452.     sendBytes[i] := bytes[Editchar,i];
  453.   END;
  454.   WriteBytes(sendBytes);
  455. END CopyChar;
  456.  
  457.  
  458. PROCEDURE DisplayChar(Editchar : CARDINAL);
  459. VAR
  460.  i: CARDINAL;
  461.  sendBytes : CharBits3;
  462. BEGIN
  463.   FOR i := 1 TO matrixY DO
  464.     sendBytes[i] := bytes[Editchar][i];
  465.     holdBits[i] := sendBytes[i]
  466.   END;
  467.  
  468.   WriteBytes(sendBytes);
  469.  
  470.   FOR i := 1 TO matrixX+1 DO
  471.     WriteScreenChar(vertOrg-1,CharOrg-1+i,Normal,CHR(Editchar));
  472.     WriteScreenChar(vertOrg+matrixY,CharOrg-1+i,Normal,CHR(Editchar));
  473.   END;
  474.  
  475.   FOR i := vertOrg-1 TO vertOrg + matrixY DO
  476.     WriteScreenChar(i,CharOrg-1,Normal,CHR(Editchar));
  477.     WriteScreenChar(i,CharOrg+matrixX,Normal,CHR(Editchar));
  478.   END;
  479.  
  480. END DisplayChar;
  481.  
  482.  
  483. PROCEDURE DisplayIbmChar(Editchar : CARDINAL);
  484. VAR
  485.  i: CARDINAL;
  486.  sendBytes : CharBits3;
  487. BEGIN
  488.  FOR i := 1 TO matrixY DO
  489.    sendBytes[i] := IBMbytes[Editchar,i];
  490.  END;
  491.  WriteBytes(sendBytes);
  492. END DisplayIbmChar;
  493.  
  494.  
  495. (* -----------------------------------------------------------------------
  496.                         main routine
  497.  ----------------------------------------------------------------------- *)
  498.  
  499. PROCEDURE Edit;
  500. VAR
  501.  posx,posy,Editchar,key : CARDINAL;
  502.  job: INTEGER;
  503.  Editing,changed,specialkey : BOOLEAN;
  504.  command,show,hold : CHAR;
  505.  keys: ARRAY[0..1] OF CHAR;
  506. BEGIN
  507.   Cls;
  508.   FOR i := 1 TO 22 DO
  509.     DisplayString(i,1,Normal,keymat[i]);
  510.   END;
  511.   guideline;
  512.   Editchar := 65;
  513.   DisplayChar(Editchar);
  514.   Editing := TRUE;
  515.   show := '*';
  516.   hold := CHR(32);
  517.   posx := CharOrg + (matrixX DIV 2);
  518.   posy := vertOrg + (matrixY DIV 2);
  519. REPEAT
  520.   changed := FALSE;
  521.   IF InKey(keys) THEN
  522.     IF SpecialKey(keys) THEN
  523.       command := keys[1];
  524.       KeyDecode(ORD(command),job,key);
  525.       CASE job OF    (* regular keys - number pad *)
  526.          -1 : CASE ORD(command) OF
  527.                  72 : DEC(posy);
  528.                       IF posy < vertOrg THEN
  529.                         posy := vertOrg;
  530.                       END;
  531.                | 75 : DEC(posx);
  532.                       IF posx < CharOrg THEN
  533.                         posx := CharOrg;
  534.                       END;
  535.                | 77 : INC(posx);
  536.                       IF posx > CharOrg + matrixX -1 THEN
  537.                         posx := CharOrg + matrixX -1;
  538.                       END;
  539.                | 80 : INC(posy);
  540.                       IF posy > vertOrg + matrixY -1 THEN
  541.                         posy := vertOrg + matrixY -1;
  542.                       END;
  543.                | 71 : clrbox;
  544.                | 79 : Editing := FALSE;
  545.                 ELSE
  546.                 END;  (* CASE -1 command OF *)
  547.          | 1 : CASE key OF
  548.                   1 : hold := ReadScreenChar(posy,posx);
  549.                       IF hold = ' ' THEN
  550.                         hold := CHR(bit)
  551.                       ELSE
  552.                         hold := ' ';
  553.                       END;
  554.                       WriteScreenChar(posy,posx,Normal,hold);
  555.                       ShowBits;
  556.                 | 2 : CopyChar;
  557.                 | 3 : ModifyChar(7);
  558.                 | 4 : ModifyChar(8);
  559.                 | 5 : ModifyChar(5);
  560.                 | 6 : ModifyChar(4);
  561.                 | 7 : ModifyChar(1);
  562.                 | 8 : ModifyChar(2);
  563.                 | 9 : WriteBytes(holdBits);
  564.                 |10 : DisplayIbmChar(Editchar);
  565.                 ELSE
  566.                   (* dummy option *)
  567.                 END;  (* CASE 1 key OF *)
  568.          | 2 : CASE key OF
  569.                   1 :
  570.                 | 2 :
  571.                 | 3 :
  572.                 | 4 :
  573.                 | 5 :
  574.                 | 6 :
  575.                 | 7 :
  576.                 | 8 :
  577.                 | 9 :
  578.                | 10 :
  579.                 ELSE
  580.                   (* dummy option *)
  581.                 END;  (* CASE 2 key OF *)
  582.          | 3 : CASE key OF
  583.                   1 :
  584.                 | 2 :
  585.                 | 3 :
  586.                 | 4 :
  587.                 | 5 :
  588.                 | 6 :
  589.                 | 7 :
  590.                 | 8 :
  591.                 | 9 :
  592.                | 10 :
  593.                 ELSE
  594.                   (* dummy option *)
  595.                 END;  (* CASE 3 key OF *)
  596.          | 4 : CASE key OF
  597.                   1 : LoadChars;
  598.                       DisplayChar(Editchar);
  599.                 | 2 : ReplaceChar(Editchar);
  600.                       SaveChars;
  601.                 | 3 :
  602.                 | 4 :
  603.                 | 5 :
  604.                 | 6 :
  605.                 | 7 :
  606.                 | 8 :
  607.                 | 9 :
  608.                | 10 :
  609.                 ELSE
  610.                   (* dummy option *)
  611.                 END;  (* CASE 2 key OF *)
  612.       ELSE
  613.       END; (* CASE job OF *)
  614.     ELSE    (* not a specialkey *)
  615.       command := keys[0];
  616.       ReplaceChar(Editchar);
  617.       Editchar := ORD(command);
  618.       DisplayChar(Editchar);
  619.     END;
  620.   ELSE  (* if not inkey - no keys pressed *)
  621.     hold := ReadScreenChar(posy,posx);
  622.     WriteScreenChar(posy,posx,Normal,show);
  623.     WriteScreenChar(posy,posx,Normal,hold);
  624.   END;
  625. UNTIL NOT Editing
  626. END Edit;
  627.  
  628. (* -----------------------------------------------------------------------
  629.                   beginning of program execution
  630.  ----------------------------------------------------------------------- *)
  631. BEGIN
  632.   Cls;
  633.  
  634.   IbmMemoryBytes := Ptr(0F000H,0FA6EH);
  635.   ToSpaces(blanks,78);
  636.  
  637.   OpenScreen[1]  := '-------------------------------------------------------------------------------';
  638.   OpenScreen[2]  := '-------------------------------------------------------------------------------';
  639.   OpenScreen[3]  := '-------------------------------------------------------------------------------';
  640.   OpenScreen[4]  := '-------------------------------------------------------------------------------';
  641.   OpenScreen[5]  := '---@@@@@@.-@@@.-@@@.--@@@@@@.--@@@@@@.---@@@@@@@@.-@@@@@@.----@@@@.--@@@@@@@@.-';
  642.   OpenScreen[6]  := '--@@.---@.--@@.-@@.--@@@.-@@@.-@.---@@@.-@@.--@@@.-@@.-@@@.----@@.---@.@@@@.@.-';
  643.   OpenScreen[7]  := '-@@.--------@.---@.--@@.---@@.-@.----@@.-@@.--------@@.--@@.------------@@.----';
  644.   OpenScreen[8]  := '-@@.--------@@@@@@.--@@.---@@.-@@@@@@@.--@@@@@@.----@@.--@@.---@@.------@@.----';
  645.   OpenScreen[9]  := '-@@.--------@.---@.--@@@@@@@@.--@@@@@.---@@.--------@@.--@@.---@@.------@@.----';
  646.   OpenScreen[10] := '-@@.--------@@.-@@.--@@.---@@.--@@.@@@.--@@.---@@.-@@.--@@.----@@.------@@.----';
  647.   OpenScreen[11] := '--@@@.--@.--@@.-@@.--@@.---@@.-@@@.--@.--@@.---@@.-@@.-@@.-----@@.-----@@@@.---';
  648.   OpenScreen[12] := '----@@@@@.-@@@.-@@@.-@@.---@@.-@@@.--@@.-@@@@@@@@.-@@@@@@.---@@@@@@.-@@@@@@@@.-';
  649.   OpenScreen[13] := '-------------------------------------------------------------------------------';
  650.   OpenScreen[14] := '-------------------------------------------------------------------------------';
  651.   OpenScreen[15] := '-------------------------------------------------------------------------------';
  652.   OpenScreen[16] := '-------------------------------------------------------------------------------';
  653.   OpenScreen[17] := '-------------------    Modula-2   CHARacter set EDITor   ----------------------';
  654.   OpenScreen[18] := '-------------------------------------------------------------------------------';
  655.   OpenScreen[19] := '-------------------      public domain BY John Tal       ----------------------';
  656.   OpenScreen[20] := '-------------------------------------------------------------------------------';
  657.   OpenScreen[21] := '------------------------  version 2.0  04/29/1986  ----------------------------';
  658.   OpenScreen[22] := '-------------------------------------------------------------------------------';
  659.  
  660.  
  661.    keymat[1] := '/---------\/---------\                                  /---------\/---------\ ';
  662.    keymat[2] := ':F1       ::F2       :                                  :F1       ::F2       : ';
  663.    keymat[3] := ':         ::         :                                  :         ::         : ';
  664.    keymat[4] := ': write   :: copy ch :                                  :load SET ::save SET : ';
  665.    keymat[5] := ':---------::---------:                                  :---------::---------: ';
  666.    keymat[6] := ':F3       ::F4       :                                  :F3       ::F4       : ';
  667.    keymat[7] := ':         ::         :                                  :         ::         : ';
  668.    keymat[8] := ':rotate Up::rotate Dn:                                  :         ::         : ';
  669.    keymat[9] := ':---------::---------:                                  :---------::---------: ';
  670.   keymat[10] := ':F5       ::F6       :                                  :F5       ::F6       : ';
  671.   keymat[11] := ':         ::         :                                  :         ::         : ';
  672.   keymat[12] := ':rotate <-::rotate ->:                                  :         ::         : ';
  673.   keymat[13] := ':---------::---------:                                  :---------::---------: ';
  674.   keymat[14] := ':F7       ::F8       :                                  :F7       ::F8       : ';
  675.   keymat[15] := ': inverse ::  twist  :                                  :         ::         : ';
  676.   keymat[16] := ':         ::         :                                  :         ::         : ';
  677.   keymat[17] := ':---------::---------:                                  :---------::---------: ';
  678.   keymat[18] := ':F9       ::F10      :                                  :F9       ::F10      : ';
  679.   keymat[19] := ':         ::         :                                  :         ::         : ';
  680.   keymat[20] := ': restore :: ibm ch. :                                  :         ::         : ';
  681.   keymat[21] := '\---------/\---------/                                  \---------/\---------/ ';
  682.   keymat[22] := '<Regular Function Key>                                   <Alt & Function Key>  ';
  683.  
  684.   FOR i := 1 TO 22 DO
  685.     DisplayString(i,1,Normal,OpenScreen[i]);
  686.   END;
  687.  
  688.   DisplayString(25,1,Normal,' Standby...... ');
  689.  
  690.   FOR i := 0 TO 15 DO
  691.     Pwr2[i] := Power(2,i);
  692.   END;
  693.  
  694.   LoadIBM;
  695.  
  696.   FOR i := 0 TO 127 DO
  697.     FOR j := 1 TO matrixY DO
  698.       bytes[i][j] := IBMbytes[i][j];
  699.     END;
  700.   END;
  701.  
  702.   pause;
  703.  
  704.   Edit;
  705.   Cls;
  706.  
  707. END CharEdit.
  708.